package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.product.ex.ServiceException;
import cn.tedu.csmall.product.mapper.BrandMapper;
import cn.tedu.csmall.product.pojo.dto.BrandAddNewDTO;
import cn.tedu.csmall.product.pojo.entity.Brand;
import cn.tedu.csmall.product.pojo.vo.BrandDetailVO;
import cn.tedu.csmall.product.pojo.vo.BrandListItemVO;
import cn.tedu.csmall.product.pojo.vo.BrandStandardVO;
import cn.tedu.csmall.product.service.IAlbumService;
import cn.tedu.csmall.product.service.IBrandService;
import cn.tedu.csmall.product.web.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@Service
public class BrandServiceImpl implements IBrandService {

    //装配品牌的mapper
    @Autowired
    private BrandMapper brandMapper;

    public BrandServiceImpl() {
        log.info("创建业务对象：BrandServiceImpl ");
    }

    @Override
    public void addNew(BrandAddNewDTO brandAddNewDTO) {
        log.debug("开始处理【添加品牌】的业务，参数：{}",brandAddNewDTO);
        //调用BrandMapper接口的int CountByName(String name)
        String name = brandAddNewDTO.getName();
        int countByName = brandMapper.countByName(name);
        log.debug("尝试添加的品牌名称是：{},在数据库中此品牌的数量为：{}",name,countByName);
        //判断该品牌是否存在
        //返回值大于0，则代表该品牌存在
        if(countByName > 0){
            String message = "添加品牌失败，品牌名称【" + name + "】已存在";
            log.warn(message);
            throw new ServiceException(ERR_CONFLICT,message);
        }
        //获取当前时间
        LocalDateTime now = LocalDateTime.now();
        //创建Brand对象
        Brand brand = new Brand();
        log.debug("初始时，添加品牌的数据：{}",brand);
        //不全brand对象中个属性的值： 值来自brandAddNewDTO，也就是输入的值
        BeanUtils.copyProperties(brandAddNewDTO,brand);
        brand.setSales(0);
        brand.setProductCount(0);
        brand.setCommentCount(0);
        brand.setPositiveCommentCount(0);
        //不全gmtCreate、gmtModified
        brand.setGmtCreate(now);
        brand.setGmtModified(now);
        log.debug("准备向数据库中添加数据，品牌的完整数据：{}",brand);
        //自动装配BrandMapper接口
        //调用BrandMapper接口的int insert(Brand brand)
        int rows = brandMapper.insert(brand);
        if(rows != 1){
            String message = "添加品牌失败！服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ERR_INSERT,message);
        }
    }

    @Override
    public void deleteById(Long id) {
        log.debug("开始处理【删除品牌】的业务，参数：{}", id);
        // 检查尝试删除的品牌是否存在
        Object queryResult = brandMapper.getStandardById(id);
        if (queryResult == null) {
            throw new ServiceException(ERR_NOT_FOUND,"删除品牌失败，尝试访问的数据不存在！");
        }

        // 执行删除
        log.debug("即使删除id为{}的品牌……", id);
        int rows = brandMapper.deleteById(id);
        if (rows != 1) {
            throw new ServiceException(ERR_DELETE,"删除品牌失败，服务器忙，请稍后再次尝试！");
        }
        log.debug("删除完成！");
    }

    @Override
    public List listData() {
        List<BrandListItemVO> list = brandMapper.getBrandDataList();
        return list;
    }

    /**
     * 根据id获取品牌详情数据
     * @param id 品牌id
     * @return 品牌详情数据
     */
    @Override
    public BrandDetailVO detailData(Long id) {
        return brandMapper.getBrandDetailById(id);
    }
}
